<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 作用域链
        // let str = "hello"
        // function fun1(){
        //     let str = "world";
        //     let num = 10;  //执行完成就会被销毁
        //     function fun2(){
        //         let num = 20;
        //         console.log(str);
        //         console.log(num);    //树形结构的意思，层级执行，执行内部，外部不可调用
        //     }
        //     fun2();
        // }
        // fun1();
        // console.log(num);                //num已经被销毁，所以不会输出数值

        //闭包
        // 利用闭包实现了代码的封装；
        // 闭包的特性：内部函数未执行完，外部函数即使执行完成，
        // 外部函数中的变量也不会被销毁。
        function fun1(){
            let n = 10;
            let m = 20;
            function fun2(){
                return n + m;   //这里不能输出fun2的值
            }
            return fun2;   //返回值是fun2函数，而不是fun2()的值
        }

        const f = fun1();  //f的值是fun1()函数的值
        const result = f();
        console.log(result);

    </script>
</body>
</html>